winsafe\dxgi\com_interfaces/
idxgiswapchain.rs

1#![allow(non_camel_case_types, non_snake_case)]
2
3use crate::co;
4use crate::decl::*;
5use crate::dxgi::vts::*;
6use crate::kernel::privs::*;
7use crate::ole::privs::*;
8use crate::prelude::*;
9
10com_interface! { IDXGISwapChain: "310d36a0-d2e7-4c0a-aa04-6a9d23b8886a";
11	/// [`IDXGISwapChain`](https://learn.microsoft.com/en-us/windows/win32/api/dxgi/nn-dxgi-idxgiswapchain)
12	/// COM interface.
13	///
14	/// Automatically calls
15	/// [`Release`](https://learn.microsoft.com/en-us/windows/win32/api/unknwn/nf-unknwn-iunknown-release)
16	/// when the object goes out of scope.
17}
18
19impl dxgi_IDXGIObject for IDXGISwapChain {}
20impl dxgi_IDXGIDeviceSubObject for IDXGISwapChain {}
21impl dxgi_IDXGISwapChain for IDXGISwapChain {}
22
23/// This trait is enabled with the `dxgi` feature, and provides methods for
24/// [`IDXGISwapChain`](crate::IDXGISwapChain).
25///
26/// Prefer importing this trait through the prelude:
27///
28/// ```no_run
29/// use winsafe::prelude::*;
30/// ```
31pub trait dxgi_IDXGISwapChain: dxgi_IDXGIDeviceSubObject {
32	/// [`IDXGISwapChain::GetBuffer`](https://learn.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgiswapchain-getbuffer)
33	/// method.
34	#[must_use]
35	fn GetBuffer<T>(&self, buffer_index: u32) -> HrResult<T>
36	where
37		T: ole_IUnknown,
38	{
39		let mut queried = unsafe { T::null() };
40		ok_to_hrresult(unsafe {
41			(vt::<IDXGISwapChainVT>(self).GetBuffer)(
42				self.ptr(),
43				buffer_index,
44				pcvoid(&T::IID),
45				queried.as_mut(),
46			)
47		})
48		.map(|_| queried)
49	}
50
51	fn_com_interface_get! { GetContainingOutput: IDXGISwapChainVT => IDXGIOutput;
52		/// [`IDXGISwapChain::GetContainingOutput`](https://learn.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgiswapchain-getcontainingoutput)
53		/// method.
54	}
55
56	/// [`IDXGISwapChain::GetDesc`](https://learn.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgiswapchain-getdesc)
57	/// method.
58	#[must_use]
59	fn GetDesc(&self) -> HrResult<DXGI_SWAP_CHAIN_DESC> {
60		let mut desc = DXGI_SWAP_CHAIN_DESC::default();
61		ok_to_hrresult(unsafe {
62			(vt::<IDXGISwapChainVT>(self).GetDesc)(self.ptr(), pvoid(&mut desc))
63		})
64		.map(|_| desc)
65	}
66
67	/// [`IDXGISwapChain::GetFrameStatistics`](https://learn.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgiswapchain-getframestatistics)
68	/// method.
69	fn GetFrameStatistics(&self) -> HrResult<DXGI_FRAME_STATISTICS> {
70		let mut stats = DXGI_FRAME_STATISTICS::default();
71		ok_to_hrresult(unsafe {
72			(vt::<IDXGISwapChainVT>(self).GetDesc)(self.ptr(), pvoid(&mut stats))
73		})
74		.map(|_| stats)
75	}
76
77	/// [`IDXGISwapChain::GetFullscreenState`](https://learn.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgiswapchain-getfullscreenstate)
78	/// method.
79	#[must_use]
80	fn GetFullscreenState(&self) -> HrResult<(bool, Option<IDXGIOutput>)> {
81		let mut fullscreen = 0;
82		let mut queried = unsafe { IDXGIOutput::null() };
83
84		ok_to_hrresult(unsafe {
85			(vt::<IDXGISwapChainVT>(self).GetFullscreenState)(
86				self.ptr(),
87				&mut fullscreen,
88				queried.as_mut(),
89			)
90		})
91		.map(|_| (fullscreen != 0, if queried.ptr().is_null() { None } else { Some(queried) }))
92	}
93
94	/// [`IDXGISwapChain::GetLastPresentCount`](https://learn.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgiswapchain-getlastpresentcount)
95	/// method.
96	#[must_use]
97	fn GetLastPresentCount(&self) -> HrResult<u32> {
98		let mut count = 0u32;
99		ok_to_hrresult(unsafe {
100			(vt::<IDXGISwapChainVT>(self).GetLastPresentCount)(self.ptr(), &mut count)
101		})
102		.map(|_| count)
103	}
104
105	/// [`IDXGISwapChain::Present`](https://learn.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgiswapchain-present)
106	/// method.
107	fn Present(&self, sync_interval: u32, flags: co::DXGI_PRESENT) -> HrResult<()> {
108		ok_to_hrresult(unsafe {
109			(vt::<IDXGISwapChainVT>(self).Present)(self.ptr(), sync_interval, flags.raw())
110		})
111	}
112
113	/// [`IDXGISwapChain::ResizeBuffers`](https://learn.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgiswapchain-resizebuffers)
114	/// method.
115	fn ResizeBuffers(
116		&self,
117		buffer_count: u32,
118		width: u32,
119		height: u32,
120		new_format: co::DXGI_FORMAT,
121		swap_chain_flags: co::DXGI_SWAP_CHAIN_FLAG,
122	) -> HrResult<()> {
123		ok_to_hrresult(unsafe {
124			(vt::<IDXGISwapChainVT>(self).ResizeBuffers)(
125				self.ptr(),
126				buffer_count,
127				width,
128				height,
129				new_format.raw(),
130				swap_chain_flags.raw(),
131			)
132		})
133	}
134
135	/// [`IDXGISwapChain::ResizeTarget`](https://learn.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgiswapchain-resizetarget)
136	/// method.
137	fn ResizeTarget(&self, new_target_parameters: &DXGI_MODE_DESC) -> HrResult<()> {
138		ok_to_hrresult(unsafe {
139			(vt::<IDXGISwapChainVT>(self).ResizeTarget)(self.ptr(), pcvoid(new_target_parameters))
140		})
141	}
142
143	/// [`IDXGISwapChain::SetFullscreenState`](https://learn.microsoft.com/en-us/windows/win32/api/dxgi/nf-dxgi-idxgiswapchain-setfullscreenstate)
144	/// method.
145	fn SetFullscreenState(
146		&self,
147		fullscreen: bool,
148		target: Option<&impl dxgi_IDXGIOutput>,
149	) -> HrResult<()> {
150		ok_to_hrresult(unsafe {
151			(vt::<IDXGISwapChainVT>(self).SetFullscreenState)(
152				self.ptr(),
153				fullscreen as _,
154				target.map_or(std::ptr::null_mut(), |t| t.ptr()),
155			)
156		})
157	}
158}